package com.xx.aop;

import com.xx.service.impl.BookServiceImpl;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.logging.Logger;

@Component  //定义组件，交由spring管理
@Aspect     //设置当前类为AOP切面类
public class MyAdvice {

    private static final Logger logger = Logger.getLogger(String.valueOf(BookServiceImpl.class));
//    @Pointcut("execution(void com.xx.service.impl.BookServiceImpl.addBook(String,String,Double))")
    @Pointcut("execution(void com.xx.service.impl.*.*(..))")
    private void pt(){

    }
    //制作切面
    @Before("pt()")
    public void method(){
        System.out.println("AOP开始时间:" + System.currentTimeMillis());
    }

    @Before("pt()")
    /*JoinPoint:代表了程序执行的某个具体位置，比如方法的调用、异常的抛出等。
    AOP框架通过拦截这些Joinpoint来插入额外的逻辑，实现横切关注点的功能*/
    public void beforeMethod(JoinPoint joinPoint){
        System.out.println("当前调用的类:"+joinPoint.getSignature()+
                "调用的方法是什么:"+joinPoint.getSignature().getName());
        System.out.println("传递的参数:");
        List<Object>list = Arrays.asList(joinPoint.getArgs());
        list.stream().forEach(o -> System.out.println(o));
    }

    @After("pt()")
    public void afterMethod(){
        System.out.println("AOP结束时间:" + System.currentTimeMillis());
    }

}
